Tarea 2. Visualización de Datos en Python y R.

Jorge Arteaga y Adriana Palacio.

Maestría en Estadística Aplicada.

Universidad del Norte.

Ejercicio 2.1

Trabajaremos con los conjuntos de datos Renewable Energy Consumption and Production de Our World in Data (https://ourworldindata.org/renewable-energy). Estos conjuntos de datos están disponibles en el repositorio GitHub del curso, púedes ser importados con las URL: share-of-electricity-production-from-renewable-sources.csv, renewable-energy-consumption-by-country.csv

Su tarea consiste en crear mapas coropléticos de la producción y el consumo totales de energía renovable y el consumo en diferentes países del mundo animados en base a los años de años de producción/consumo entre (excluyendo) 2007 y 2017.

Primero, cargaremos los modulos que se usarán en todo el taller:

Primero, leamos los archivos de la URL, y carguemoslos en un DataFrame de pandas:

Primero, revisemos si el dataframe de producción de energía renovable tiene valores faltantes.

Como se puede observar, solo la columna de Code tiene valores faltantes, con el 5.54% de valores faltantes. Si bien, lo ideal sería imputar estos datos, para el ejercicio que realiceramos no afectará los cálculos o nivel de producción. Esto nos afectará solamente en la presentación del código, por lo cual, por lo pronto, dejaremos el dataframe así.

Ordenemos ahora el dataframe relacionado con la producción de energía renovable en función del año.

Generemos un mapa de cloropletas para la producción de energía renovable utilizando el módulo de plotly express, con un slider para mostrar el cambio a través de los años de manera dinámica:

Como se puede observar en la figura, en el año 1990, los países que producen más energía renovable son mayoritariamente de Latinoamérica y África, entre ellos, Paraguay, Costa Rica, Honduras, Brasil, ambos Congos, Zambia, Camerún, entre otros. En Europa, los países con más producción son Noruega e Islandia. Se puede observar que los países que tienen menos producción de energía renovable están ubicados en Asia-Pacífico, Europa, el Norte de África y Estados Unidos.

En 2014, se observa que las regiones que producían más energía renovable han bajado considerablemente su producción de energía renovable, siguen liderando a nivel mundial la producción (África central y Latinoamérica). De los países que siguen con un porcentaje del 99% de producción, Paraguay, República Democrática del Congo y Zambia siguen liderando.

En Europa, se nota un aumento en la producción de energía renovable, siendo Noruega e Islandia los países que siguen teniendo la mayor producción de energía renovable. Las regiones con menor producción de energía renovable siguen siendo las mismas que hace 14 años, Asia-Pacífico, el Norte de África y Estados Unidos.

Miremos ahora el dataframe relacionado con el consumo de energía renovable en el mundo. Para esto, primero lo transformaremos. Primero imputaremos los valores faltantes.

Como estamos hablando de consumo de energía, asumiremos que el hecho de que no haya información sobre una energía renovable específica, implica que no hay capacidad de generación de dicha energía en el país, por lo que podríamos reemplazar estos valores por cero sin ningún problema.

Como se observa, las columnas de Traditional Biofuels y Hydropower tienen el 100% de valores faltantes. Estas columnas no nos están aportando ninguna información relevante, por lo cual las borraremos.

Como se puede observar, contamos con cinco columnas. Una que representa el año, tres que representan distintos tipos de energía renovable, y la última columna que nos indica el total de consumo de energía renovable. Para el gráfico que realizaremos, usaremos en primera instancia el total de consumo de energía renovable.

Primero organicemos el dataframe por año.

Prosigamos ahora con el gráfico para el consumo total de energía renovable por país a través de los años.

Como se puede observar en la animación, poco países consumían energía renovable en 1965, y la cantidad era muy pequeña. El país que más consumía renovables era Italia con 2.6TWh. Al pasar de los años, más países empiezan a consumir energía renovable, y la cantidad de la energía consumida aumenta considerablemente. En 2016, los países con más consumo de energía renovable son China, Estados Unidos, y Alemania, con 380TWh, 370TWh y 167TWh, respectivamente.

Ejercicio 2.2

Los modulos que vamos a usar fueron cargados al principio del taller, ahora solo cargaremos el tema de paper, para que las gráficas se vean mejor.

Para conectarnos a la API de FinnHub a través de Python, debemos tener una cuenta creada para usar la API key de dicha cuenta. En la siguiente celda, creamos una instancia del cliente de FinnHub con nuestra API key.

El símbolo que vamos a usar para extraer la información es BINANCE:BTCUSDT:

Teniendo el cliente instanciado, y el código a utilizar, ahora extraeremos toda la información asociada al par BTC:USDT:

Como se puede observar, incluso aunque coloquemos las fechas correctamente, FinnHub tiene una restricción sobre el número de columnas que nos puede dar por consulta, de 500. Lo que haremos entonces es hacer múltiples consultas para completar toda la historia transaccional del BTC.

Ahora procedemos a unir todos los dataframes en uno solo con toda la información:

Una vez completada la extracción de los datos, cambiemos los nombres de las columnas, eliminemos la columna s que no nos aportará nada al modelo, y cambiemos también el formato del tiempo.

Demosle un vistazo a la historia del BTC, y grafiquemos la serie temporal:

Se puede observar que desde que se empezó a tranzar, el precio de Bitcoin empezó alrededor de los USD $\$5.000$ y tuvó una tendencia alcista hasta casi que alcanzar los USD $\$20.000$ en diciembre de 2017. Luego de esto, tuvo una fuerte caída y volvió a los mismos niveles. Desde 2018, estuvo por debajo de los USD $\$10.000$, hasta mediados de 2019 donde supero levemente esa barrera. Luego de superarla, tuvo unas cuantas subidas y bajadas, pero el precio se mantenía alrededor de este valor, hasta finales de 2020, donde tuvo un crecimiento rápido, hasta alcanzar los USD $\$62.000$ aproximadamente, en Marzo de 2021. Luego de eso, tuvo una corrección, pero volvió a subir para alcanzar su máximo histórico situado en torno a los USD $\$68.000$ en Octubre de 2021. Actualmente, presenta una tendencia bajista, y se sitúa en torno a los USD $\$53.000$.

Para continuar, antes de iniciar los modelos, realicemos una prueba estadística para verificar si la serie temporal asociada al par BTC:USDT es estacionaria o no. La prueba que usaremos es la de Dickey-Fuller.

Como se puede observar, con un nivel de significancia del 5%, el P-valor es mayor que el alpha, por lo cual, la hipótesis nula no se rechaza. Esto significa que no hay evidencia suficiente para afirmar que la serie temporal es estacionaria. Miremos ahora las figuras de autocorrelación, para verificar cuál es el orden de integración necesario para llevar nuestra serie de tiempo no estacionaria a una estacionaria.

Se puede notar el decaimiento geométrico en la primera figura de autocorrelación (la serie original), que baja desde la parte positiva con una tendencia lineal. Esto también nos muestra y nos confirma la prueba de Dickey-Fuller, que la serie no es estacionaria. También se puede ver en el segundo gráfico de autocorrelación, correspondiente a la segunda derivada, que el retardo entra rápidamente en la zona negativa del gráfico, por lo cual nos indica que la serie fue sobrediferenciada.

Prosigamos ahora si con los modelos ARIMA para predecir el precio del Bitcoin. Como usaremos varios horizontes, crearemos una función general, que calcule el mejor modelo, y tendremos como entrada el horizonte.

También usaremos la función mostrada en clase por el profesor, para calcular el error de predicción cometido en las predicciones, usando las métrica MAPE, MAE, RMSE, MSE:

Calculemos primero, los mejores modelos ARIMA, usando horizontes de 7, 14, 21 y 28 días, y usando el criterio de Akaike. Mantendremos constantes los rangos usados en clase para calcular el mejor orden.

Revisemos para cada horizonte, cuál es el mejor modelo usando el criterio de Akaike:

Con los mejores modelos según el criterio de Akaike, podemos usarlos para predecir los valores futuros usando rolling. Para esto, usaremos los modelos guardados en la variable best_models. Adicionalmente, usaremos también la función utilizada en clase, con unos pequeños cambios (Ya calculamos el modelo y lo entrenamos, así que solo haremos las predicciones).

Como se puede observar, tenemos errores bastantes altos para los modelos. El error más bajo fue para el modelo de 7 días. Esto se debe a la naturaleza de la serie temporal que estamos analizando, ya que por su alta volatilidad, es díficil predecir precios a más tiempo. También, podríamos tratar de tunear mejor los modelos, al usar más parámetros, pero esto aumentaría considerablemente el tiempo de cómputo.

Ahora, calculemos la misma tabla y los mismos modelos, pero esta vez teniendo en cuenta el criterio de inferencia Bayesiana para la selección de los mejores modelos. De esta manera podremos comparar las métricas arrojadas por la selección de cada criterio:

Si bien, con el criterio Bayesiano estamos obteniendo valores un poquito más altos que con el criterio de Akaike, a la final, con los dos criterios se obtiene el mismo orden para cada horizonte evaluado, por lo cual, las predicciones de ambos modelos serán las mismas, y de esta manera, sus errores también lo serán. Por esta razón, no calcularemos la tabla de las métricas para los modelos generados mediante el criterio de inferencia bayesiana, ya que obtuvimos modelos del mismo orden.

Por último, grafiquemos entonces los resultados de las predicciones:

Como habíamos vaticinado al principio, las predicciones son muy malas. Para mejorarlas, necesitamos seguir iterando sobre los hiper-parámetros (en este caso, el orden del modelo), o probar con otros parámetros del modelo ARIMA, para ver si encontramos una combinación que funcione mejor.

Ejercicio 2.3

Determine las características que se visualizan en un gráfico de dispersión. Se le da el conjunto de datos c02.csv y se le pide que propocione información sobre él, como por ejemplo, qué tipo de patrones existen, si hay tendencias entre las características,.etc. Es necesario que su visualziación final transmita información significativa. Para conseguirlo, va a crear visualizaciones para diferentes emparejamientos de características para entender si esán correlacionadas y, por lo tant, vale la pena visualizarlas.

Pasos principales

Cargamos el conjuto de datos co2.csv y gapminder.csv

La información de los dos dataframes anteriores, los unificaremos dejando solo las columnas de interés:

Visualicemos la relación entre el co2 y life. El coeficiente de correlación nos indica que hay una correlación positiva moderada.

Si vemos por ejemplo el año 2013 tenemos que para "East Asia & Pacific" tenemos que las mayores emisiones de co2 se dan cuanto se tiene una esperanza de vida mayor, este mismo coportamiento se aprecia en "America". Mientras que en "South Asia" no hay gran diferencia entre las emisiones de co2 y la esperanza de vida, se puede decir que son independientes.

Si miramos las emisiones de co2 para "South Asia" a lo largo de los años (1964 - 2013) vemos como las emisiones de co2 se mantienen en el mismo rango.

Al revisar ahora la relación entre co2 y fertility ,tenemos que el hay una correlación negativa moderada según el valor que nos arroja el coeficiente de correlación

Si nos enfocamos por ejemplo en el año 2000, vemos que las emisiones de calor más grande se tienen en "Middle East & North Africa".

Graficamente se nota por ejemplo que en "East Asia & Pacific" y "America" a menos fertilidad mayores emisiones de c02, a lo largo de todos los años analizados

Al comparar las emisiones de c02 entre las regiones vemos que "Middle East & North Africa" a lo largo de los años ha tenido las mayores emisiones.

Ejercicio 2.4

CREATE TABLE links (
    id SERIAL PRIMARY KEY,
    url VARCHAR(255) NOT NULL,
    name VARCHAR(255) NOT NULL,
    description VARCHAR (255),
    last_update DATE
);
INSERT INTO links (url, name)
VALUES('https://www.postgresqltutorial.com','PostgreSQL Tutorial');
INSERT INTO links (url, name)
VALUES('http://www.oreilly.com','O''Reilly Media');
INSERT INTO links (url, name)
VALUES('http://www.oreilly.com','O''Reilly Media');
INSERT INTO links (url, name, last_update)
VALUES('https://www.google.com','Google','2013-06-01');
INSERT INTO links (url, name)
VALUES('http://www.postgresql.org','PostgreSQL') 
RETURNING id;

Primero creamos conexión con nuestra base de datos PostgresSql que se encuentra en Heroku.

Procedemos a crear una nueva tabla como sigue:

Ahora, insertaremos registros en la tabla:

Importamos los datos del precio de Cardano USD (ADA-USD)

Cargamos el dataset en nuestra base de datos en Heroku

Leemos los datos dese nuestra tabla "cardano" de la base de datos

Vemos que nuestro dataframe no tiene los nombres de las columnas, entonces procedemos a ajustarlo de acuerdo a los nombres de las columnas en nuestra tabla dentro de la base de datos.

Por último realizamos el candlestick para la criptomoneda

Vemos como por ejemplo, los precios de Cardano, tuvieron una caída luego de enero de 2018 y su precio se mantuvo muy cercano a los 0.03 USD hasta julio de 2020 donde empezó a subir su precio, logrando alcanzar casi los 3 USD para septiembre de 2021. Actualmente el precio de Cardano se encuentra a la baja con valroes al rededor de los 2.5 USD.

Ahora si nos enfocamos en el mes de agosto de 2021, vemos que es mayor el volumen de compras (velas verdes) que las ventas (velas rojas).

Si revisamos el último registro que tenemos, vemos que para el 14 de Octubre de 2021, el precio de Cardano abrió en 2.195 USD y cerró 2.179 USD, con valores mínimo y maximo de 2.162 y 2.221, respectivamente.